/*
 * Copyright (c) 2010-2011, okazoh_tk. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the copyright holder nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "alkes/graph/TextNode.h"
#include <string.h>

namespace alkes {

TextNode::TextNode()
: color_(Color::BLACK)
{
}

TextNode::~TextNode()
{
}

bool TextNode::construct(
    TextNode& node, IGraphics2DDevice* device, IGlyphProvider* glyph_provider, const char* text, const Color& color)
{
    return node.construct(device, glyph_provider, text, IGlyphProvider::AL_ENCODING_UTF8, color);
}

bool TextNode::construct(
    TextNode& node, IGraphics2DDevice* device, IGlyphProvider* glyph_provider, const wchar_t* text, const Color& color)
{
    return node.construct(device, glyph_provider, text, IGlyphProvider::AL_ENCODING_DEFAULT, color);
}

bool TextNode::construct(
    IGraphics2DDevice* device, IGlyphProvider* glyph_provider, const void* text, IGlyphProvider::Encoding encoding, const Color& color)
{
    if (!device || !glyph_provider || !text)
        return false;

    intrusive_ptr<ImageShape> shape(device->createImageShape(1));
    if (!shape)
        return false;

    glyph_provider->setEncoding(encoding);

    IGlyphProvider::TextMetrics metrics = glyph_provider->getTextMetrics();
    uint16_t width;
    glyph_provider->getTextWidth(text, width);

    intrusive_ptr<ImageBuffer> buf(device->createImage(width, metrics.height, AL_PIXEL_FORMAT_A8));
    if (!buf)
        return false;

    glyph_provider->renderText(text, *buf, 0, 0, true);

    shape->setImage(buf, 0, 0, width, metrics.height);
    shape->setParam(Point2D::ZERO, color);

    setShape(shape);
    color_ = color;
    setSize(URectSize(width, metrics.height));
    setRenderCount(0, 1);

    return true;
}

void TextNode::setTextColor(const Color& color)
{
    if (setProperty(color_, color))
    {
        ImageShape* shape = restrict_cast<ImageShape*>(getShape());
        if (shape)
            shape->setColor(color);
    }
}

}
